package pois.agenda.utilidades;

import java.util.Calendar;
import java.util.Random;

import com.google.java.contract.Requires;

import pois.agenda.Agenda;
import pois.agenda.Evento;
import pois.agenda.MiAgenda;
import pois.agenda.MiEvento;

public class Utilidades {
	
		
	/**
	 ** Este metodo se encargara de modificar la agenda que ya tenemos tiene que:
	 * 	-anadir eventos
	 * 	-borrar eventos
	 * 	-modificar el contenido de algun evento existente 
	 * @param miagenda
	 * @param inserEventos
	 * @param borrarEventos
	 * @param modificarEventos
	 * @return devuelve un objeto Miagenda modificado
	 */
	
	@Requires(value={"miagenda != null,borrarEventos<=miagenda.cantidad()"})
	public static MiAgenda modifica_agenda(MiAgenda miagenda,int inserEventos,int borrarEventos, int modificarEventos) {
		Evento eventoaux;
		
		miagenda.inicia();
		llena_agenda(miagenda, inserEventos);
		
		for (int i = 0; i < borrarEventos; i++) {
			miagenda.borra_evento();
		}
		
		for (int i = 0; i < modificarEventos; i++) {
			
			eventoaux = miagenda.elemento();
			miagenda.borra_evento();
			miagenda.inserta(modifica_evento(eventoaux));
			
		}
		/*miagenda.imprime_agenda();*/
        
		return miagenda;
	}

	@Requires (value="evento !=null")
	public static Evento modifica_evento(Evento evento) {
		Evento eventoModificado;
		
		eventoModificado= new MiEvento(evento.inicio(), evento.fin(), evento.esTodoElDia(),"evento modificado!!!" + evento.descripcion());
		
		return eventoModificado;
	}

	
	@Requires (value="evento !=null")
	public static  Agenda llena_agenda(Agenda agenda, int numeventos){
		int i;
		int n_evento=1;
		
		for (i=0; i<numeventos; i++){
			agenda.inserta(crea_evento(n_evento));
			n_evento++;
		}
		return agenda;
	}
	
	public static MiEvento crea_evento(int n_evento){
		
		MiEvento evento;
		Calendar principio_evento;
		Calendar fin_evento;	
		boolean todoeldia;
		String descripcion;
		
		Random  rnd = new Random();	
		int aux = (int)(rnd.nextDouble()*2+1);
		
		if (aux == 1) {
			todoeldia = true;
		}else
			todoeldia = false;
		
		principio_evento= crea_calendario_aleatorio();
		do {
			fin_evento = crea_calendario_aleatorio();
		} while (fin_evento.compareTo(principio_evento)<0);
		
		descripcion="Evento "+n_evento;
		
		
		evento = new MiEvento(principio_evento,fin_evento,todoeldia,descripcion);
		
		
		return evento;
	}
	
	public static Calendar crea_calendario_aleatorio() {
		
		Calendar calendario;
		
		calendario=Calendar.getInstance();
		
		int anno = 0;
		int mes = 0;
		int dia = 0;
		int hora = 0;
		int minuto = 0;
		int segundo = 0;
		Random  rnd = new Random();		
		
		/*
		 * ahora creamos la fecha aleatoria 
		 */

		
		anno = (int)(rnd.nextDouble()*3+2012);
		mes = (int)(rnd.nextDouble()*12+1);
		
		
		if ((mes == 1) || (mes == 3) || (mes == 5) || (mes == 7) || (mes == 8) || (mes == 10) || (mes == 12)){
			dia = (int)(rnd.nextDouble()*31+1);
		}
		
		else if ((mes == 4) || (mes == 6) || (mes == 9) || (mes == 11)){
			dia = (int)(rnd.nextDouble()*30+1);
		}
		
		else if (mes == 2){
			dia = (int)(rnd.nextDouble()*28+1);
		}
		
		
			hora = (int)(rnd.nextDouble()*25);
			minuto = (int)(rnd.nextDouble()*61);
			
			calendario.set(anno, mes, dia, hora, minuto, segundo);
				
			
		return calendario;
	}

	
}
